package spring3.controller;

import java.lang.reflect.Type;
import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.validation.Valid;

import org.apache.axis2.AxisFault;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.SessionAttributes;
import org.springframework.web.servlet.ModelAndView;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

import spring3.form.AdministradorVO;
import spring3.form.EncriptacionVO;
import spring3.form.Formulario;
import localhost.encryp.service.application.servicio_encryp.servicio_encrypsoa_php.Servicio_encrypServiceStub;
import localhost.encryp.service.application.servicio_encryp.servicio_encrypsoa_php.Servicio_encrypServiceStub.AgregarAdministrador;
import localhost.encryp.service.application.servicio_encryp.servicio_encrypsoa_php.Servicio_encrypServiceStub.AgregarAdministradorResponse;
import localhost.encryp.service.application.servicio_encryp.servicio_encrypsoa_php.Servicio_encrypServiceStub.Desencriptar;
import localhost.encryp.service.application.servicio_encryp.servicio_encrypsoa_php.Servicio_encrypServiceStub.DesencriptarResponse;
import localhost.encryp.service.application.servicio_encryp.servicio_encrypsoa_php.Servicio_encrypServiceStub.Encriptar;
import localhost.encryp.service.application.servicio_encryp.servicio_encrypsoa_php.Servicio_encrypServiceStub.EncriptarResponse;
import localhost.encryp.service.application.servicio_encryp.servicio_encrypsoa_php.Servicio_encrypServiceStub.GenerarLogin;
import localhost.encryp.service.application.servicio_encryp.servicio_encrypsoa_php.Servicio_encrypServiceStub.GenerarLoginResponse;
import localhost.encryp.service.application.servicio_encryp.servicio_encrypsoa_php.Servicio_encrypServiceStub.MostrarHistorico;
import localhost.encryp.service.application.servicio_encryp.servicio_encrypsoa_php.Servicio_encrypServiceStub.MostrarHistoricoResponse;
import localhost.encryp.service.application.servicio_encryp.servicio_encrypsoa_php.Servicio_encrypServiceStub.VerificarLoginVigente;
import localhost.encryp.service.application.servicio_encryp.servicio_encrypsoa_php.Servicio_encrypServiceStub.VerificarLoginVigenteResponse;


// TODO: Auto-generated Javadoc
/**
 * The Class UserController.
 */
@Controller
@SessionAttributes
public class UserController {
	
	/**
	 * pagina encriptar.
	 *
	 * @param session the session
	 * @return the model and view
	 */
	@RequestMapping("/encriptar")
	public ModelAndView pagEncriptar(HttpSession session){
		if(!verificarToken(session)){
			System.out.println("token expirado");
			return new ModelAndView("log", "command", new AdministradorVO());
		}else{
			return new ModelAndView("paginaencriptar", "command", new EncriptacionVO());
		}
		
	}
	
	/**
	 * ejecuta la encriptacion.
	 *
	 * @param session the session
	 * @return the model and view
	 */
	@RequestMapping(value="/ejecutar", method=RequestMethod.POST)
	public ModelAndView encriptar(@RequestParam String action,String texto,HttpSession session){

		
		Servicio_encrypServiceStub oStub;
		try {
			oStub = new Servicio_encrypServiceStub();
		
	    if( action.equals("encriptar") ){
	    	
	    	Encriptar e =new Encriptar ();
	    	e.setTexto(texto);
	    	e.setToken((String) session.getAttribute("token"));
	    	EncriptarResponse objResponse = oStub.encriptar(e);		
			String encriptado = objResponse.get_return();
	    		    	
	    	return new ModelAndView("mensaje", "message", "encriptado: "+encriptado);
	    }
	    else if( action.equals("desencriptar") ){
	    	
	    	Desencriptar e =new Desencriptar ();
	    	e.setTexto(texto);
	    	e.setToken((String) session.getAttribute("token"));
	    	DesencriptarResponse objResponse = oStub.desencriptar(e);		
			String desencriptado = objResponse.get_return();
	    	
	    	return new ModelAndView("mensaje", "message", "desencriptado: "+ desencriptado);
	    }
		} catch (AxisFault e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		} catch (RemoteException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
	    return new ModelAndView("mensaje", "message", "error");

	} 

	/**
	 * Mostrar agregar usuario.
	 *
	 * @param session the session
	 * @return the model and view
	 */
	@RequestMapping("/add")
	public ModelAndView mostrarAgregarUsuario(HttpSession session){
		if(!verificarToken(session)){
			System.out.println("token expirado");
			return new ModelAndView("log", "command", new AdministradorVO());
		}else{
			return new ModelAndView("usuarioadd", "command", new AdministradorVO());
		}
	}
	
	/**
	 * Agregar usuario
	 *
	 * @param session the session
	 * @return the model and view
	 */
	@RequestMapping("/agregarUsuario")
	public ModelAndView agregarCliente(@ModelAttribute("AdministradorVO") @Valid  AdministradorVO admin, HttpSession session){
		if(!verificarToken(session)){
			System.out.println("token expirado");
			return new ModelAndView("log", "command", new AdministradorVO());
		}else{
			
			try {
				
				Gson gson = new Gson();
				String AdministradorVOJSON= gson.toJson(admin);
    		
				Servicio_encrypServiceStub oStub = new Servicio_encrypServiceStub();
    		
    		AgregarAdministrador agregar = new AgregarAdministrador ();
    		agregar.setOAdministradorVOJSON(AdministradorVOJSON);
    		
    		AgregarAdministradorResponse objResponse;
			
				objResponse = oStub.agregarAdministrador(agregar);
			
			
    		String mensaje = objResponse.get_return();
			
			return new ModelAndView("mensaje", "message", mensaje);
			
		} catch (RemoteException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return new ModelAndView("mensaje", "message", "ERROR"+e);
		}
		}
		
	}
	
	/**
	 * Mostrar login.
	 *
	 * @param session the session
	 * @return the model and view
	 */
	@RequestMapping("/login")
    public ModelAndView mostrarLogin(HttpSession session) {
		
		if(verificarToken(session)){
			System.out.println("ya loggeado");
			return new ModelAndView("principal", "command", "");
		}else{
			return new ModelAndView("log", "command", new AdministradorVO());
		}
         
        
    }
	
	@RequestMapping("/logout")
    public ModelAndView logout(HttpSession session) {
		session.setAttribute("token", "");
		return new ModelAndView("log", "command", new AdministradorVO());
	}
	
	/**
	 * Login.
	 *
	 * @param admin the admin
	 * @param result the result
	 * @param session the session
	 * @return the model and view
	 */
	@RequestMapping("/logear")
	public ModelAndView logearAdministrador(@ModelAttribute("Administrador") @Valid AdministradorVO admin, BindingResult result, HttpSession session){
		
		if(result.hasErrors()) {
   		 System.out.println("ERROR");
            return new ModelAndView("contact");
        }
		try{
			Servicio_encrypServiceStub oStub = new Servicio_encrypServiceStub();
		AdministradorVO AdministradorVO = new AdministradorVO();
		
		AdministradorVO.setUsuario(admin.getUsuario());
		AdministradorVO.setContrasena(admin.getContrasena());
		
		GenerarLogin logAdmin = new GenerarLogin();
		
		Gson gson = new Gson();
		String AdministradorVOJSON= gson.toJson(AdministradorVO);
		
		logAdmin.setAdministradorVOJson(AdministradorVOJSON);
		GenerarLoginResponse objResponse = oStub.generarLogin(logAdmin);		
		String mensaje = objResponse.get_return();
		
		
		
		session.setAttribute("token", mensaje);
		//if (mensaje.length()==30){
		if(verificarToken(session)){
			session.setAttribute("token", mensaje);
			System.out.println("su token es: " +mensaje);
			System.out.println("Este token sera valido por 30 minutos");
			return new ModelAndView("principal", "token", mensaje);	
		}else{
		
		return new ModelAndView("mensaje", "message", mensaje);
		}
		} catch (RemoteException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();

			return new ModelAndView("error", "message", "ERROR");
		}
	}
	
	/**
	 * Mostrar principal.
	 *
	 * @param session the session
	 * @return the model and view
	 */
	@RequestMapping("/principal")
	public ModelAndView mostrarPrincipal(HttpSession session){
		
		if(!verificarToken(session)){
			System.out.println("token expirado");
			return new ModelAndView("log", "command", new AdministradorVO());
		}else{
			return new ModelAndView("principal", "command", "");
		}
	}
	
	/**
	 * Mostrar clientes.
	 *
	 * @param session the session
	 * @return the model and view
	 */
	@RequestMapping("/show")
	public ModelAndView mostrarClientes(HttpSession session) {
		
		if(!verificarToken(session)){
			System.out.println("token expirado");
			return new ModelAndView("log", "command", new AdministradorVO());
		}else{
		
		Formulario form = new Formulario();
		Servicio_encrypServiceStub oStub;
		
		try {
			oStub = new Servicio_encrypServiceStub();
			
        	MostrarHistorico oMostrarHistorico = new MostrarHistorico();
        	oMostrarHistorico.setToken((String) session.getAttribute("token"));

        	MostrarHistoricoResponse objResponde = oStub.mostrarHistorico(oMostrarHistorico);
     		
        	String HistoricosJSON= objResponde.get_return();
        	
        	Type listType = new TypeToken<ArrayList<spring3.form.EncriptacionVO>>() {}.getType();
			List<spring3.form.EncriptacionVO> clientes = new Gson().fromJson(HistoricosJSON, listType);
        	
        	
     		
			 form.setObj(clientes);
			 return new ModelAndView("showclienterow" , "Formulario", form);
			 
			} catch (AxisFault e) {
				e.printStackTrace();
				return new ModelAndView("error", "message", e);
			} catch (RemoteException e) {
				e.printStackTrace();
				return new ModelAndView("error", "message", e);
			}
		}	 
	         
	         
        
	}
    	
	//funciones
	/**
	 * Verificar token.
	 *
	 * @param session the session
	 * @return true, if successful
	 */
	private boolean verificarToken(HttpSession session) {

		String valid = "true";
		String token = (String) session.getAttribute("token");
		System.out.println("esto " + token);

		Servicio_encrypServiceStub stub;
		try {
			stub = new Servicio_encrypServiceStub();

			VerificarLoginVigente verif = new VerificarLoginVigente();
			verif.setToken(token);
			VerificarLoginVigenteResponse response = stub
					.verificarLoginVigente(verif);
			valid = response.get_return();
		} catch (AxisFault e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (RemoteException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println("valido" + valid);

		return (valid.equals("true"));
	}

}
